/* 
 * File:   RepositorioBuilder.cpp
 * Author: max
 * 
 * Created on June 9, 2013, 2:12 PM
 */

#include "common_RepositorioBuilder.h"
#include "common_FileUtils.h"

using namespace TP::Archivos;

RepositorioBuilder::RepositorioBuilder() {}

RepositorioBuilder::~RepositorioBuilder() {}

Repositorio* RepositorioBuilder::ConstruirDeRutaDirectorio(const string& pRutaDirectorio){
    
    FileUtils fileUtils;
    
    if (!fileUtils.DirectorioExistente(pRutaDirectorio))
    {
        return NULL;
    }
    
    Repositorio* repositorio = new Repositorio(pRutaDirectorio);
    repositorio->SetVersion(VERSION_REPOSITORIO_DEFAULT);
    
    // Se lee la lista de archivos contenida en el directorio.
    LNombreArchivo archivos;
    fileUtils.ObtenerNombreArchivos(pRutaDirectorio, archivos);
    
    // Para todo archivo contenido en el direcotrio =>

    LNombreArchivo::iterator it = archivos.begin();
    while (it < archivos.end())
    {
        RepoItem* item = CrearRepoItem (pRutaDirectorio, (*it));
        if (NULL != item)
        {
            repositorio->AgregarRepoItem(item);
        }
        it++;
    }
    return repositorio;
}

RepoItem* RepositorioBuilder::CrearRepoItem (const string &pRutaDirectorio, const string &pNombreArchivo) {

    // Se declara el archivo en el repositorio.
    RepoItem* item = new RepoItem();

    item->SetVersion (VERSION_ARCHIVO_DEFAULT);
    item->SetEstado(ARCHIVO_DETECTADO);
    item->SetFilePath(pRutaDirectorio);
    item->SetFilename(pNombreArchivo);

    // Se computan los hashes que definen al archivo.
    ComputarHashesDeArchivo (item);
    
    return item;
}

void RepositorioBuilder::ComputarHashesDeArchivo (RepoItem* pItem){
    
    if (NULL == pItem) return;

    FileUtils fileUtils;
    size_t cantidadChunks = fileUtils.CalcularCantidadChunks(pItem->GetRutaCompletaArchivo());
    
    for (size_t i = 0; i < cantidadChunks; i++)
    {
        
        pItem->AddHash(fileUtils.GetHash(pItem->GetRutaCompletaArchivo(), i));
    }
}